﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GeodeticCoordinates
{
    internal class EllipsoidParameters
    {
        public struct Ellipse
        {
            private string _name;
            public string Name { set { _name = value; } get { return _name; } }//椭球名称

            private double _a;
            public double a { set { _a = value; } get { return _a; } }//长轴半径

            private double _b;
            public double b { set { _b = value; } get { return _b; } }//短轴半径

            private double _e1;
            public double e1 { set { _e1 = value; } get { return _e1; } }//第一偏心率

            private double _e2;
            public double e2 { set { _e2 = value; } get { return _e2; } }//第二偏心率

            private double _f;
            public double f { set { _f = value; } get { return _f; } }//扁率

            private double _c;
            public double c { set { _c = value; } get { return _c; } }//极曲率半径
        }

        public string[] SetEllipse(int _index)
        {
            string[] ellipse = new string[7];
            Ellipse _re = new Ellipse();
            switch (_index)
            {
                case 0:
                    {
                        _re.Name = "克拉索夫斯基椭球";
                        _re.a = 6378245.0000;
                        _re.b = 6356863.01877;
                        _re.e1 = (Math.Pow(_re.a, 2) - Math.Pow(_re.b, 2)) / Math.Pow(_re.a, 2);
                        _re.e2 = 0.00673852541468;
                        _re.f = (_re.a - _re.b) / _re.a;
                        _re.c = Math.Pow(_re.a, 2) / _re.b;
                        break;
                    }
                case 1:
                    {
                        _re.Name = "Bessel椭球";
                        _re.a = 6377397.155;
                        _re.b = 6356078.963;
                        _re.e1 = (Math.Pow(_re.a, 2) - Math.Pow(_re.b, 2)) / Math.Pow(_re.a, 2);
                        _re.e2 = 0.0067192188;
                        _re.f = (_re.a - _re.b) / _re.a;
                        _re.c = Math.Pow(_re.a, 2) / _re.b;
                        break;
                    }
                case 2:
                    {
                        _re.Name = "西安80/国际1975年椭球";
                        _re.a = 6378140.0000;
                        _re.b = 6356755.288158;
                        _re.e1 = (Math.Pow(_re.a, 2) - Math.Pow(_re.b, 2)) / Math.Pow(_re.a, 2);
                        _re.e2 = 0.00673950182; //第二偏心率
                        _re.f = (_re.a - _re.b) / _re.a;
                        _re.c = Math.Pow(_re.a, 2) / _re.b;
                        break;
                    }
                case 3:
                    {
                        _re.Name = "WGS-84椭球";
                        _re.a = 6378137.0000;
                        _re.b = 6356752.3142;
                        _re.e1 = (Math.Pow(_re.a, 2) - Math.Pow(_re.b, 2)) / Math.Pow(_re.a, 2);
                        _re.e2 = (Math.Pow(_re.a, 2) - Math.Pow(_re.b, 2)) / Math.Pow(_re.b, 2);
                        _re.f = (_re.a - _re.b) / _re.a;
                        _re.c = Math.Pow(_re.a, 2) / _re.b;
                        break;
                    }
            }

            ellipse[0] = _re.Name;
            ellipse[1] = Convert.ToString(_re.a);
            ellipse[2] = Convert.ToString(_re.b);
            ellipse[3] = Convert.ToString(_re.e1);
            ellipse[4] = Convert.ToString(_re.e2);
            ellipse[5] = Convert.ToString(_re.f);
            ellipse[6] = Convert.ToString(_re.c);

            return ellipse;
        }
    }
}
